%    Copyright (C) 2000 artofcode LLC.  All rights reserved.
% 
% This software is provided AS-IS with no warranty, either express or
% implied.
% 
% This software is distributed under license and may not be copied,
% modified or distributed except as expressly authorized under the terms
% of the license contained in the file LICENSE in this distribution.
% 
% For more information about licensing, please refer to
% http://www.ghostscript.com/licensing/. For information on
% commercial licensing, go to http://www.artifex.com/licensing/ or
% contact Artifex Software, Inc., 101 Lucas Valley Road #110,
% San Rafael, CA  94903, U.S.A., +1(415)492-9861.

% $Id: gs_cidtt.ps 6300 2005-12-28 19:56:24Z giles $
% Redefine CIDFont category with an emulation with True Type fonts.

languagelevel 2 .setlanguagelevel

15 dict begin    % a temporary dictionary for local binding.

%------------------Copy the FontEmulationProcs here : -------------------

/FontEmulationProcs /ProcSet findresource {
  def
} forall

currentdict /super.complete_instance currentdict /complete_instance get put

%-------Auxiliary procedures for building CIDFontType 2 from TT file -----------

/GenerateCIDMap   % <font> GenerateCIDMap <font>
{ begin
    % Obtain the maximal CID :
    %   This implementation doesn't check whether glyphs really present.
    Decoding /CIDCount get /CIDCount exch def
    % Prepare the CIDMap structure :
    /CIDMap [
      CIDCount 22000 le {
        CIDCount 2 mul string
      } {
        44000 string
        CIDCount 44000 gt {
	   % need three strings
           44000 string		% 22000 2 mul string
           CIDCount 44000 sub 2 mul string
        } {
           CIDCount 22000 sub 2 mul string
        } ifelse
      } ifelse
    ] def
    % Now fill it :
    Decoding TT_cmap SubstNWP GDBytes CIDMap .fillCIDMap
  currentdict end
} bind def

/load_sfnts  % <FontDict> load_sfnts <FontDict> 
{ % Read the True Type file from the path /Path, and buld /sfnts,
  % skipping glyf and loca. 
  dup /Path get                                            % <font> (path)
  QUIET not {
    (Loading a TT font from ) print dup print 
    ( to emulate a CID font ) print 1 index /CIDFontName get =only ( ... ) print
  } if
  (r) file dup                                             % <font> file file
  3 1 roll                                                 % file <font> file
  1 index /SubfontID .knownget not { 0 } if                % file <font> file SubfontID
  .load_tt_font_stripped exch copy                         % file <font>
  QUIET not {
    (Done.) =
  } if
  dup 3 1 roll                                             % <font> file <font>
  exch /File exch put                                      % <font>
  dup dup /CIDSystemInfo get /Ordering get (.)             % <font> () ()
  2 index /Decoding get =string cvs                        % <font> () () ()
  concatstrings concatstrings cvn /Decoding exch put       % <font>
  //ChooseDecoding exec                                    % <font>
  //GenerateCIDMap exec                                    % <font>
} bind def

%-----------TrueType-specific methods for category redefinition : -----------

/RefinePath      % <FontDict> RefinePath <FontDict>
{ dup begin
  Path .libfile {
      dup .filename {
        currentdict exch /Path exch put
      } if
      closefile
  } {
    (Can't find the font file ) print =
    /findfont cvx /undefinedfilename signalerror
  } ifelse
  end
} bind def

/complete_instance  % <font_name> <FontDict> <Options> complete_FAPI_Font <font_name> <FontDict>
{ 1 index /CIDFontType 2 put % Other types are not emulated yet.
  //super.complete_instance exec
  //RefinePath exec
  //load_sfnts exec
} bind def

/IsMyRecord      % <raw_record> -> <raw_record> bool
{ dup type /dicttype eq { dup /FileType .knownget { /TrueType eq } { false } ifelse } { false } ifelse
} bind def

/IsActive       % <record> IsActive <bool>
{ pop true
} bind def

/CIDFontRecordVirtualMethods //RecordVirtualMethodsStub dup length 3 add dict copy begin
  /GetCSI //TranslateCSI def
  /IsActive //IsActive def
  /MakeInstance   % <Name> <record> MakeInstance <Name> <Instance> <size>
  { //CIDFontOptions //complete_instance exec
    2 copy //GetSize exec
  } bind def
currentdict end def

% Redefine the /CIDFont category :
4 dict begin
  /CategoryName /CIDFont def
  /IsMapFileOptional true def
  /VerifyMap  { pop } bind def
  /PreprocessRecord  % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool>
  { //IsMyRecord exec dup {
      pop dup /RecordVirtualMethods //CIDFontRecordVirtualMethods put
      true
    } if
  } bind def
currentdict end

/MappedCategoryRedefiner /ProcSet findresource /Redefine get exec

end  % the temporary dictionary for local binding.

.setlanguagelevel
